package com.mall.entity

import jakarta.persistence.*
import org.hibernate.annotations.SQLDelete
import org.hibernate.annotations.Where
import java.time.LocalDateTime

/**
 * 管理员实体类
 * 
 * 该实体类使用JPA注解映射到数据库表，主要功能：
 * 1. 实现管理员账户的数据存储
 * 2. 使用软删除机制（不直接从数据库删除记录）
 * 3. 支持用户名唯一性校验
 * 4. 记录数据的创建、更新和删除时间
 * 
 * @Entity JPA实体类注解
 * @Table 指定数据库表名为admins
 * @SQLDelete 自定义删除SQL，实现软删除
 * @Where 查询时自动过滤已删除的记录
 */
@Entity
@Table(name = "admins")
@SQLDelete(sql = "UPDATE admins SET deleted_at = now() WHERE id = ?")
@Where(clause = "deleted_at IS NULL")
data class Admin(
    /**
     * 管理员ID
     * 
     * @Id 标识主键
     * @GeneratedValue 使用数据库自增策略生成ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long? = null,
    
    /**
     * 管理员用户名
     * 
     * @Column 设置字段属性：
     * - nullable = false 不允许为空
     * - unique = true 用户名唯一
     * - length = 50 字段长度限制
     */
    @Column(nullable = false, unique = true, length = 50)
    var username: String = "",
    
    /**
     * 管理员密码
     * 
     * 存储加密后的密码哈希值，使用BCrypt加密算法
     * 长度设置为100以适应加密后的字符串长度
     */
    @Column(nullable = false, length = 100)
    var password: String = "",
    
    /**
     * 管理员邮箱
     * 
     * 可选字段，但要求唯一，用于找回密码等功能
     */
    @Column(unique = true, length = 100)
    var email: String? = null,
    
    /**
     * 管理员角色
     * 
     * 默认值为"admin"，用于实现权限控制
     */
    @Column(length = 20)
    var role: String = "admin",
    
    /**
     * 账户状态
     * 
     * 默认值为"active"，可用于临时禁用账户
     */
    @Column(length = 10)
    var status: String = "active",
    
    /**
     * 记录创建时间
     * 
     * 由数据库在插入记录时自动设置
     */
    @Column(name = "created_at")
    var createdAt: LocalDateTime? = null,
    
    /**
     * 记录更新时间
     * 
     * 由数据库在更新记录时自动设置
     */
    @Column(name = "updated_at")
    var updatedAt: LocalDateTime? = null,
    
    /**
     * 记录删除时间
     * 
     * 实现软删除机制，而不是物理删除记录
     * 当字段为null时表示记录未删除
     */
    @Column(name = "deleted_at")
    var deletedAt: LocalDateTime? = null
)